/*
 * Copyright (c) OSGi Alliance (2005). All Rights Reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v1.0 which accompanies this
 * distribution, and is available at http://www.eclipse.org/legal/epl-v10.html.
 *
 * This copyright applies to the comments and public final static String fields only
 */
package org.osgi.core.framework.events
{
	import flash.events.Event;

	import org.osgi.core.framework.interfaces.IBundle;


	/**
	 * An event from the Framework describing a bundle lifecycle change.
	 * <p>
	 * <code>BundleEvent</code> objects are delivered to
	 * <code>BundleListener</code> objects when a change occurs in a bundle's
	 * lifecycle. A type code is used to identify the event type for future
	 * extendability.
	 *
	 * <p>
	 * OSGi Alliance reserves the right to extend the set of types.
	 *
	 * @version $Revision: 1.15 $
	 */

	public class BundleEvent extends Event
	{
		private static var serialVersionUID:Number=4080640865971756012;
		/**
		 * Bundle that had a change occur in its lifecycle.
		 */
		private var bundle:IBundle;

		/**
		 * The bundle has been installed.
		 * <p>
		 * The value of <code>INSTALLED</code> is 0x00000001.
		 *
		 * @see BundleContext#installBundle(String)
		 */
		public static var INSTALLED:int=0x00000001;

		/**
		 * The bundle has been started.
		 * <p>
		 * The value of <code>STARTED</code> is 0x00000002.
		 *
		 * @see Bundle#start
		 */
		public static var STARTED:int=0x00000002;

		/**
		 * The bundle has been stopped.
		 * <p>
		 * The value of <code>STOPPED</code> is 0x00000004.
		 *
		 * @see Bundle#stop
		 */
		public static var STOPPED:int=0x00000004;

		/**
		 * The bundle has been updated.
		 * <p>
		 * The value of <code>UPDATED</code> is 0x00000008.
		 *
		 * @see Bundle#update()
		 */
		public static var UPDATED:int=0x00000008;

		/**
		 * The bundle has been uninstalled.
		 * <p>
		 * The value of <code>UNINSTALLED</code> is 0x00000010.
		 *
		 * @see Bundle#uninstall
		 */
		public static var UNINSTALLED:int=0x00000010;

		/**
		 * The bundle has been resolved.
		 * <p>
		 * The value of <code>RESOLVED</code> is 0x00000020.
		 *
		 * @see Bundle#RESOLVED
		 * @since 1.3
		 */
		public static var RESOLVED:int=0x00000020;

		/**
		 * The bundle has been unresolved.
		 * <p>
		 * The value of <code>UNRESOLVED</code> is 0x00000040.
		 *
		 * @see Bundle#INSTALLED
		 * @since 1.3
		 */
		public static var UNRESOLVED:int=0x00000040;

		/**
		 * The bundle is about to start.
		 * <p>
		 * The value of <code>STARTING</code> is 0x00000080.
		 *
		 * @see Bundle#start()
		 * @since 1.3
		 */
		public static var STARTING:int=0x00000080;

		/**
		 * The bundle is about to stop.
		 * <p>
		 * The value of <code>STOPPING</code> is 0x00000100.
		 *
		 * @see Bundle#stop()
		 * @since 1.3
		 */
		public static var STOPPING:int=0x00000100;

		/**
		 * Creates a bundle event of the specified type.
		 *
		 * @param type The event type.
		 * @param bundle The bundle which had a lifecycle change.
		 */

		public function BundleEvent(type:String, bundle:IBundle)
		{
			this.bundle=bundle;
			super(type);
		}

		/**
		 * Returns the bundle which had a lifecycle change. This bundle is the
		 * source of the event.
		 *
		 * @return The bundle that had a change occur in its lifecycle.
		 */
		public function getBundle():IBundle
		{
			return bundle;
		}

		/**
		 * Returns the type of lifecyle event. The type values are:
		 * <ul>
		 * <li>{@link #INSTALLED}
		 * <li>{@link #RESOLVED}
		 * <li>{@link #STARTING}
		 * <li>{@link #STARTED}
		 * <li>{@link #STOPPING}
		 * <li>{@link #STOPPED}
		 * <li>{@link #UPDATED}
		 * <li>{@link #UNRESOLVED}
		 * <li>{@link #UNINSTALLED}
		 * </ul>
		 *
		 * @return The type of lifecycle event.
		 */

		public function getType():String
		{
			return type;
		}

		/**
		 * @inheritDoc
		 */
		override public function clone():Event
		{
			return new BundleEvent(type, bundle);
		}
	}
}